"""
Theme Custom 应用卸载模块
包含所有与卸载相关的功能函数

主要功能：
1. 恢复工作空间配置
2. 清理自定义HTML块
3. 移除工作空间快捷方式
4. 移除架构图菜单项
5. 恢复品牌化配置
6. 恢复导航栏配置

作者: Theme Custom Team
版本: 1.0.0
"""

import frappe
import os
import shutil
import re
from theme.utils.workspace_utils import (
    restore_workspace_from_backup,
    clean_workspace_elements
)
from theme.utils.workspace_shortcuts_utils import (
    remove_workspace_shortcuts
)
from theme.utils.architecture_menu_utils import (
    remove_architecture_menu_item
)
from theme.utils.navbar_utils import (
    restore_navbar_help_dropdown_from_backup,
    clean_navbar_backup_files
)
from theme.utils.html_block_utils import delete_html_block


def before_uninstall():
    """
    在 theme 应用卸载前执行的函数
    执行顺序：
    1. 恢复Home工作空间配置
    2. 删除安装时创建的 home HTML 块记录
    3. 移除工作空间快捷方式
    4. 移除架构图菜单项
    5. 恢复帮助下拉菜单
    6. 恢复 ERPNext 品牌化配置
    7. 恢复 Frappe Framework 品牌化配置
    """
    try:
        print("🚀 开始执行 Theme Custom 应用卸载流程...")
        
        # 1. 恢复Home工作空间配置
        print("📋 步骤1/7: 恢复Home工作空间配置")
        restore_home_workspace()
        
        # 2. 删除 home HTML 块记录
        print("🗑️ 步骤2/7: 删除自定义HTML块记录")
        delete_home_html_block()
        
        # 3. 移除工作空间快捷方式
        print("🔗 步骤3/7: 移除工作空间快捷方式")
        remove_workspace_shortcuts_on_uninstall()
        
        # 4. 移除架构图菜单项
        print("🏗️ 步骤4/7: 移除架构图菜单项")
        remove_architecture_menu_on_uninstall()
        
        # 5. 恢复帮助下拉菜单
        print("🎯 步骤5/7: 恢复导航栏帮助菜单")
        restore_help_dropdown_on_uninstall()
        
        # 6. 恢复 ERPNext 品牌化配置
        print("🏢 步骤6/7: 恢复ERPNext品牌化配置")
        restore_erpnext_branding()
        
        # 7. 恢复 Frappe Framework 品牌化配置
        print("⚙️ 步骤7/7: 恢复Frappe Framework品牌化配置")
        restore_frappe_branding()
        
        # 提交数据库事务
        frappe.db.commit()
        
        print("✅ Theme Custom 卸载完成！")
        print("   ✓ 所有自定义配置已清理")
        print("   ✓ 工作空间配置已恢复")
        print("   ✓ 品牌化配置已还原")
        frappe.msgprint("✅ Theme Custom 卸载完成，已清理所有相关数据并恢复原始配置！", alert=True)
        
    except Exception as e:
        # 回滚事务
        frappe.db.rollback()
        frappe.log_error(f"Theme Custom 卸载过程中出现错误: {str(e)}")
        frappe.throw(f"卸载过程中出现错误: {str(e)}")


def restore_home_workspace():
    """
    恢复Home工作空间配置
    从备份文件中恢复原始配置
    """
    try:
        print("🔄 开始恢复Home工作空间配置...")
        
        # 尝试从备份恢复Home工作空间
        restore_success = restore_workspace_from_backup("Home")
        
        if restore_success:
            print("✅ 成功恢复Home工作空间配置")
        else:
            print("⚠️ 未找到备份文件或恢复失败，跳过恢复")
        
        # 强制清理工作空间中的theme相关元素（作为备用恢复方案）
        print("🧹 执行强制清理工作空间元素...")
        try:
            clean_success = clean_workspace_elements(
                workspace_name="Home",
                keep_types=[]  # 清理所有非默认类型
            )
            if clean_success:
                print("✅ 强制清理完成")
        except Exception as clean_error:
            print(f"⚠️ 强制清理失败: {str(clean_error)}")
        
        # 执行数据迁移以确保更改生效
        print("🔄 执行数据迁移...")
        frappe.db.commit()
        
    except Exception as e:
        frappe.log_error(f"恢复Home工作空间配置时出错: {str(e)}")
        print(f"❌ 恢复Home工作空间配置失败: {str(e)}")
        # 不抛出异常，允许卸载继续进行


def delete_home_html_block():
    """
    删除安装时创建的 home HTML 块记录
    """
    try:
        print("🗑️ 检查并删除 home HTML 块记录...")
        
        # 检查 home HTML 块是否存在
        if frappe.db.exists("Custom HTML Block", "home"):
            # 删除记录
            frappe.delete_doc("Custom HTML Block", "home", ignore_permissions=True)
            print("✅ 成功删除 home HTML 块记录")
        else:
            print("📝 home HTML 块记录不存在，跳过删除")
            
    except Exception as e:
        frappe.log_error(f"删除 home HTML 块记录时出错: {str(e)}")
        print(f"❌ 删除 home HTML 块记录失败: {str(e)}")


def remove_workspace_shortcuts_on_uninstall():
    """
    卸载时移除工作空间快捷方式
    """
    try:
        print("🗑️ 开始移除工作空间快捷方式...")
        
        # 移除工作空间快捷方式
        success = remove_workspace_shortcuts()
        
        if success:
            print("✅ 工作空间快捷方式移除完成")
        else:
            print("⚠️ 工作空间快捷方式移除部分失败，请检查日志")
        
    except Exception as e:
        frappe.log_error(f"卸载时移除工作空间快捷方式出错: {str(e)}")
        print(f"❌ 移除工作空间快捷方式失败: {str(e)}")


def remove_architecture_menu_on_uninstall():
    """
    卸载时移除架构图菜单项
    """
    try:
        print("🗑️ 开始移除架构图菜单项...")
        
        # 移除架构图菜单项
        success = remove_architecture_menu_item()
        
        if success:
            print("✅ 架构图菜单项移除完成")
        else:
            print("⚠️ 架构图菜单项移除失败，请检查日志")
        
    except Exception as e:
        frappe.log_error(f"卸载时移除架构图菜单项出错: {str(e)}")
        print(f"❌ 移除架构图菜单项失败: {str(e)}")


def restore_help_dropdown_on_uninstall():
    """
    卸载时恢复帮助下拉菜单
    """
    try:
        print("🔄 开始恢复导航栏帮助菜单...")
        
        # 从备份恢复帮助下拉菜单
        success = restore_navbar_help_dropdown_from_backup()
        
        if success:
            print("✅ 导航栏帮助菜单恢复完成")
        else:
            print("⚠️ 导航栏帮助菜单恢复失败，请检查日志")
        
        # 清理备份文件
        print("🧹 清理导航栏备份文件...")
        clean_navbar_backup_files()
        
    except Exception as e:
        frappe.log_error(f"卸载时恢复导航栏帮助菜单出错: {str(e)}")
        print(f"❌ 恢复导航栏帮助菜单失败: {str(e)}")


def restore_erpnext_branding():
    """
    恢复 ERPNext 品牌化配置
    包含：
    1. 恢复应用标题为 ERPNext
    2. 恢复所有logo引用路径为原始状态
    3. 优先使用备份文件恢复
    """
    try:
        print("🔄 开始恢复 ERPNext 品牌化配置...")
        
        # 检查 ERPNext 应用是否存在
        if "erpnext" not in frappe.get_installed_apps():
            print("⚠️ ERPNext 应用未安装，跳过恢复操作")
            return
        
        # 获取 ERPNext hooks.py 文件的路径
        erpnext_hooks_path = os.path.join(
            frappe.get_app_path("erpnext"), "hooks.py"
        )
        backup_path = erpnext_hooks_path + ".theme_backup"
        
        # 优先使用备份文件恢复
        if os.path.exists(backup_path):
            shutil.copy2(backup_path, erpnext_hooks_path)
            os.remove(backup_path)  # 删除备份文件
            print("✅ 成功从备份文件恢复 ERPNext 应用配置")
            return
        
        # 如果没有备份文件，则使用正则表达式恢复
        if not os.path.exists(erpnext_hooks_path):
            print(f"❌ ERPNext hooks.py 文件不存在: {erpnext_hooks_path}")
            return
        
        # 读取文件内容
        with open(erpnext_hooks_path, 'r', encoding='utf-8') as file:
            content = file.read()
        
        # 检查是否需要恢复
        if 'app_title = "ERPNext"' in content and '/assets/theme/images/nextjia-logo.svg' not in content:
            print("📝 ERPNext 应用配置已经是原始状态，无需恢复")
            return
        
        # 使用正则表达式进行精确恢复 - 恢复标题
        app_title_pattern = r'^app_title\s*=\s*["\']NextJia["\']'
        content = re.sub(app_title_pattern, 'app_title = "ERPNext"', content, flags=re.MULTILINE)
        
        # 恢复所有 logo 路径引用
        logo_restore_patterns = [
            (r'app_logo_url\s*=\s*["\'][^"\']*theme[^"\']*["\']', 'app_logo_url = "/assets/erpnext/images/erpnext-logo.svg"'),
            (r'"logo":\s*["\'][^"\']*theme[^"\']*["\']', '"logo": "/assets/erpnext/images/erpnext-logo.svg"'),
            (r'"splash_image":\s*["\'][^"\']*theme[^"\']*["\']', '"splash_image": "/assets/erpnext/images/erpnext-logo.svg"'),
            (r'email_brand_image\s*=\s*["\'][^"\']*theme[^"\']*["\']', 'email_brand_image = "assets/erpnext/images/erpnext-logo.jpg"'),
        ]
        
        for pattern, replacement in logo_restore_patterns:
            content = re.sub(pattern, replacement, content)
        
        # 写回文件
        with open(erpnext_hooks_path, 'w', encoding='utf-8') as file:
            file.write(content)
        
        print("✅ 成功恢复 ERPNext 应用标题和 Logo 为原始状态")
        
    except Exception as e:
        frappe.log_error(f"恢复 ERPNext hooks.py 文件时出错: {str(e)}")
        print(f"❌ 恢复 ERPNext 配置失败: {str(e)}")
        # 不抛出异常，允许卸载继续进行


def restore_frappe_branding():
    """
    恢复 Frappe Framework 品牌化配置
    将 app_title 从 "NexBlock" 恢复为 "Frappe Framework"
    """
    try:
        print("🔄 开始恢复 Frappe Framework 品牌化配置...")
        
        # 获取 Frappe hooks.py 文件的路径
        frappe_hooks_path = os.path.join(
            frappe.get_app_path("frappe"), "hooks.py"
        )
        backup_path = frappe_hooks_path + ".theme_backup"
        
        # 优先使用备份文件恢复
        if os.path.exists(backup_path):
            shutil.copy2(backup_path, frappe_hooks_path)
            os.remove(backup_path)  # 删除备份文件
            print("✅ 成功从备份文件恢复 Frappe 应用标题")
            return
        
        # 如果没有备份文件，则使用正则表达式恢复
        if not os.path.exists(frappe_hooks_path):
            print(f"❌ Frappe hooks.py 文件不存在: {frappe_hooks_path}")
            return
        
        # 读取文件内容
        with open(frappe_hooks_path, 'r', encoding='utf-8') as file:
            content = file.read()
        
        # 检查是否需要恢复
        if 'app_title = "Frappe Framework"' in content:
            print("📝 Frappe 应用标题已经是原始状态，无需恢复")
            return
        
        # 使用正则表达式进行精确恢复 - 恢复标题
        app_title_pattern = r'^app_title\s*=\s*["\']NexBlock["\']'
        
        content = re.sub(app_title_pattern, 'app_title = "Frappe Framework"', content, flags=re.MULTILINE)
        
        # 写回文件
        with open(frappe_hooks_path, 'w', encoding='utf-8') as file:
            file.write(content)
        
        print("✅ 成功恢复 Frappe Framework 应用标题为原始状态")
        
    except Exception as e:
        frappe.log_error(f"恢复 Frappe hooks.py 文件时出错: {str(e)}")
        print(f"❌ 恢复 Frappe 配置失败: {str(e)}")
        # 不抛出异常，允许卸载继续进行